#include <stdio.h>
#include <GL/glut.h>
void init(void);
void display(void);
void spinDisplay(void);
void mouse(int button, int state, int x, int y);
void reshape(int w, int h);
void keyboard(unsigned char key, int x, int y);
int main(int argc, char** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
	glutInitWindowSize(1366, 768);
	glutInitWindowPosition(10, 10);
	glutCreateWindow(argv[0]);
	init();
	glutDisplayFunc(display);
	glutReshapeFunc(reshape);
	glutKeyboardFunc(keyboard);
	glutMouseFunc(mouse);
	glutMainLoop();
	return 0;
}
static int year = 0, day = 0;
static GLfloat spin = 0.0;

void init(void)
{
	glClearColor (0.0, 0.0, 0.0, 0.0);
	glEnable(GL_DEPTH_TEST);
	glShadeModel (GL_FLAT);
}

void display(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glPushMatrix();
	glColor3f (1.0, 0, 0);
	glRotatef((GLfloat)year, 0.0, 1.0, 0.0);
	glRotatef(spin, 1.0, 1.0, 1.0);
	glutWireSphere(1.0, 20, 16);
	glRotatef(spin, 0.0, 0.0, 1.0);
	///

	///
	glTranslatef (2.0, 0.0, 0.0);
	glRotatef((GLfloat) day, 0.0, 1.0, 0.0);
	glColor3f (0, 1.0, 0);
	glRotatef(spin, 1.0, 0.0, 0.0); //
	glutWireSphere(0.2, 10, 8);
	////
	glPopMatrix();
	glutSwapBuffers();
}

void spinDisplay(void)
{
   spin = spin + 2.0;
   if (spin > 360.0)
      spin = spin - 360.0;
   glutPostRedisplay();
}

void mouse(int button, int state, int x, int y)
{
   switch (button) {
   case GLUT_LEFT_BUTTON:
         if (state == GLUT_DOWN)
            glutIdleFunc(spinDisplay);
         break;
	  case GLUT_RIGHT_BUTTON:
         if (state == GLUT_DOWN)
            glutIdleFunc(NULL);
         break;
      default:
         break;
   }
}

void reshape (int w,int h)
{
	glViewport (0, 0, (GLsizei) w, (GLsizei) h);
	glMatrixMode (GL_PROJECTION);
	glLoadIdentity ();
	gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
/* xét thao tác trên ModelView */
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);

}
void keyboard (unsigned char key,int x,int y)
{
	switch(key)
	{
		case 'e':
			day = (day + 10) % 360;
			glutPostRedisplay();
			break;
		case'E':
			day = (day - 10) % 360;
			glutPostRedisplay();
			break;
		case 'y':
			year = (year + 10) % 360;
			glutPostRedisplay();
			break ;
		case'Y':
			year = (year - 10) % 360;
			glutPostRedisplay();
			break;
		case ' ':
			year = (year - 5) % 720;
			glutPostRedisplay();
			break;
		default:
			break;
	}
}
